#自定义异常类Lenmax
#当输入的列表长度大于10，抛出该异常
class Lenmax(Exception):
	#该异常类在创建对象时需要接收一个参数
    def __init__(self,len_list):
        self.len_list = len_list
    def __str__(self):
        print("长度太长")

def length():
    lst = input("输入：").split()
    lst1 = len(lst)
    print(lst1)
    if lst1 < 10:
        print("列表的长度在合理范围内")
    else:
        raise (Lenmax(lst1)) #手动抛出自定义的异常类
length()

#自定义异常类：消息小于8时抛出异常
#自定义异常类Numsmall
#当输入的数字小于8时，抛出该异常
class Numsmall(Exception):
	#该异常类在创建对象时需要接收一个参数
    def __init__(self,num):
        self.num = num
    def __str__(self):
        print("数字太小了")

def number():
    num1 = int(input("请输入一个数字："))
    if num1 > 8:
        print("输入数字")
    else:
        raise Numsmall(msg) #手动抛出自定义的异常类
number()




class Fibonacci:     # 斐波那契数列
    def __init__(self):
        self.seq = [0,1,1]                  #序列第1项，第2项为1
        self.maxKey = 1000

    def computeTo(self,key):
        for idx in range(len(self.seq), key + 1):
            v = self.seq[idx - 1] + self.seq[idx - 2]
            self.seq.append(v)

    def __getitem__(self,key):
         if not isinstance(key,int):         #判断是否int类型
             raise TypeError
         if key <=0 or key > self.maxKey:    #数列不含第0项，最大1000项
             raise IndexError
        if key > len(self.seq):
            self.computeTo(key)             #计算序列的前key项
        return self.seq[key]

    def __setitem__(self,key,value):        #key为下标，value为值
         if not isinstance(key,int):         #判断是否int类型
             raise TypeError
        if key <=0 or key > self.maxKey:    #数列不含第0项，最大1000项
            raise IndexError
        if key > len(self.seq):
            self.computeTo(key)             #计算序列的前key项
        self.seq[key] = value

    def __len__(self):
        return self.maxKey      #返回最大项数1000作为长度

f = Fibonacci()                 #实例化Fibonacci类
print("f[30]=",f[30])           #取值，导致f.__getitem__(30)被执行
f[10] = "谢潇伊"                 #赋值，导致f.__setitem__(10,"谢潇伊")被执行
for i in range(1,21):
    print(f[i],end=",")         #取值，导致f.__getitem__(i)被执行
print("")                       #换行
print("Length of f:",len(f))    #len(f)导致f.__len__()被执行
